package cdu.sl.controller;


import cdu.sl.common.Result;
import cdu.sl.dto.SaveRoleDTO;
import cdu.sl.entity.Role;
import cdu.sl.service.RoleService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/roles")
@RequiredArgsConstructor
@Slf4j
public class RoleController {

    private final RoleService roleService;

    /**
     * 新增角色
     * @param saveRoleDTO 新增角色数据实体
     * @return 统一响应结果
     */
    @PostMapping
    @PreAuthorize("hasAuthority('PERMISSION_ADD')")
    public Result addRole(@RequestBody SaveRoleDTO saveRoleDTO) {
        log.info("新增角色:{}", saveRoleDTO);
        roleService.add(saveRoleDTO);
        return Result.success();
    }


    /**
     * 修改角色
     * @param saveRoleDTO 修改角色数据实体
     * @return 统一响应结果
     */
    @PreAuthorize("hasAuthority('ROLE_UPDATE')")
    @PutMapping
    public Result updateRole(@RequestBody SaveRoleDTO saveRoleDTO) {
        log.info("修改角色：{}", saveRoleDTO);
        roleService.update(saveRoleDTO);
        return Result.success();
    }


    /**
     * 删除角色
     * @param id 角色id
     * @return 统一响应结果
     */
    @PreAuthorize("hasAuthority('ROLE_DELETE')")
    @DeleteMapping("/{id}")
    public Result deleteRole(@PathVariable Integer id) {
        log.info("删除角色,角色id：{}", id);
        roleService.delete(id);
        return Result.success();
    }

    /**
     * 获取所有角色信息
     * @return 所有角色信息
     */
    @PreAuthorize("hasAnyRole('ADMIN','USER','MANAGER')")
    @GetMapping("/list")
    public Result list() {
        log.info("获取所有角色信息");
        List<Role> roles = roleService.findAll();
        return Result.success(roles);
    }

    /**
     * 按照id查询角色信息
     * @param id 角色id
     * @return 角色信息
     */
    @PreAuthorize("hasAnyRole('ADMIN','USER','MANAGER')")
    @GetMapping("/{id}")
    public Result getById(@PathVariable Integer id) {
        log.info("获取角色信息：{}", id);
        Role role = roleService.getById(id);
        return Result.success(role);
    }


}
